package proyecto.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import javax.sql.DataSource;
import proyecto.excepcion.DAOExcepcion;
import proyecto.excepcion.LoginExcepcion;
import proyecto.modelo.Paciente;

public class PacienteDAOImpl extends BaseDAO implements PacienteDAO {

    private DataSource dataSource;

    public DataSource getDataSource() {
        return dataSource;
    }

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    public Paciente validar(String login, String password) throws DAOExcepcion, LoginExcepcion {
        System.out.println("-------------------PacienteDAOImpl: validar: login: " + login + ", Pass: " + password);
        String query = "select id_paciente, nombres, apellidos, sexo, fec_nacimiento, fec_registro, telefono, email, numero_documento, tipo_documento, login, password from tb_paciente where login=? and password=?";
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        Paciente vo = new Paciente();
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setString(1, login);
            stmt.setString(2, password);
            rs = stmt.executeQuery();

            if (rs.next()) {
                System.out.println("SI EXISTEEEEE!");
                vo.setId_paciente(Integer.parseInt(rs.getString("id_paciente")));
                vo.setNombres(rs.getString("nombres"));
                vo.setApellidos(rs.getString("apellidos"));
                vo.setSexo(rs.getString("sexo"));
                vo.setFec_nacimiento(rs.getString("fec_nacimiento"));
                vo.setFec_registro(rs.getString("fec_registro"));
                vo.setTelefono(rs.getString("telefono"));
                vo.setEmail(rs.getString("email"));
                vo.setNumero_documento(rs.getString("numero_documento"));
                vo.setTipo_documento(rs.getString("tipo_documento"));
                vo.setLogin(rs.getString("login"));
                vo.setPassword(rs.getString("password"));
            } else {
                throw new LoginExcepcion("No existe");
            }
        } catch (LoginExcepcion e) {
            System.err.println(e.getMessage());
            throw e;
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        return vo;
    }

    public Paciente actualizar(Paciente paciente) throws DAOExcepcion {
        System.out.println("Pintando aquí en el DAO...: " + paciente.getId_paciente() + paciente.getNombres() + paciente.getApellidos() + paciente.getSexo() + paciente.getTelefono() + paciente.getEmail() + paciente.getNumero_documento() + paciente.getTipo_documento());
        String query = "update tb_paciente set nombres=?, apellidos=?, sexo=?, telefono=?, email=?, numero_documento=?, tipo_documento=? where id_paciente=?";
        
        Connection con = null;
        PreparedStatement stmt = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setString(1, paciente.getNombres());
            stmt.setString(2, paciente.getApellidos());
            stmt.setString(3, paciente.getSexo());
            stmt.setString(4, paciente.getTelefono());
            stmt.setString(5, paciente.getEmail());
            stmt.setString(6, paciente.getNumero_documento());
            stmt.setString(7, paciente.getTipo_documento());
            stmt.setInt(8, paciente.getId_paciente());

            int i = stmt.executeUpdate();
            System.out.println(i);
            if (i != 1) {
                throw new SQLException("No se pudo actualizar!");
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }

        //----------------------

        query = "select id_paciente, nombres, apellidos, sexo, fec_nacimiento, fec_registro, telefono, email, numero_documento, tipo_documento, login, password from tb_paciente where login=? and password=?";
        ResultSet rs = null;
        Paciente vo = new Paciente();
        
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setString(1, paciente.getLogin());
            stmt.setString(2, paciente.getPassword());
            rs = stmt.executeQuery();
        
            if (rs.next()) {
            vo.setId_paciente(Integer.parseInt(rs.getString("id_paciente")));
            vo.setNombres(rs.getString("nombres"));
            vo.setApellidos(rs.getString("apellidos"));
            vo.setSexo(rs.getString("sexo"));
            vo.setFec_nacimiento(rs.getString("fec_nacimiento"));
            vo.setFec_registro(rs.getString("fec_registro"));
            vo.setTelefono(rs.getString("telefono"));
            vo.setEmail(rs.getString("email"));
            vo.setNumero_documento(rs.getString("numero_documento"));
            vo.setTipo_documento(rs.getString("tipo_documento"));
            vo.setLogin(rs.getString("login"));
            vo.setPassword(rs.getString("password"));
        }
        } catch (Exception e2) {
            System.out.println(e2.getMessage());
        }
        
        return vo;
    }

    public Paciente actualizarPassword(Paciente paciente) throws DAOExcepcion {
        String query = "update tb_paciente set password = ? where id_paciente = ?";

        Connection con = null;
        PreparedStatement stmt = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setString(1, paciente.getPassword());
            stmt.setInt(2, paciente.getId_paciente());

            int i = stmt.executeUpdate();
            System.out.println(i);
            if (i != 1) {
                throw new SQLException("No se pudo actualizar Password!");
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }

        //----------------------

        query = "select id_paciente, nombres, apellidos, sexo, fec_nacimiento, fec_registro, telefono, email, numero_documento, tipo_documento, login, password from tb_paciente where login=? and password=?";
        ResultSet rs = null;
        Paciente vo = new Paciente();

        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setString(1, paciente.getLogin());
            stmt.setString(2, paciente.getPassword());
            rs = stmt.executeQuery();

            if (rs.next()) {
            vo.setId_paciente(Integer.parseInt(rs.getString("id_paciente")));
            vo.setNombres(rs.getString("nombres"));
            vo.setApellidos(rs.getString("apellidos"));
            vo.setSexo(rs.getString("sexo"));
            vo.setFec_nacimiento(rs.getString("fec_nacimiento"));
            vo.setFec_registro(rs.getString("fec_registro"));
            vo.setTelefono(rs.getString("telefono"));
            vo.setEmail(rs.getString("email"));
            vo.setNumero_documento(rs.getString("numero_documento"));
            vo.setTipo_documento(rs.getString("tipo_documento"));
            vo.setLogin(rs.getString("login"));
            vo.setPassword(rs.getString("password"));
        }
        } catch (Exception e2) {
            System.out.println(e2.getMessage());
        }


        return vo;
    }

    public boolean validarPassword(String login, String password) throws DAOExcepcion {
        String query = "select * from tb_paciente where login=? and password=?";
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        boolean existe=false;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setString(1, login);
            stmt.setString(2, password);
            rs = stmt.executeQuery();

            if (rs.next()) {
                //Existe;
                existe = true;
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        return existe;
    }

    public Collection<Paciente> listarPacientes() throws DAOExcepcion {
        String query = "Select * from tb_paciente";
        Collection<Paciente> lista = new ArrayList<Paciente>();
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            rs = stmt.executeQuery();
            while (rs.next()) {
                Paciente vo = new Paciente();
                vo.setId_paciente(rs.getInt("id_paciente"));
                vo.setNombres(rs.getString("nombres"));
                vo.setApellidos(rs.getString("apellidos"));
                vo.setSexo(rs.getString("sexo"));
                vo.setFec_nacimiento(rs.getString("fec_nacimiento"));
                vo.setFec_registro(rs.getString("fec_registro"));
                vo.setTelefono(rs.getString("telefono"));
                vo.setEmail(rs.getString("email"));
                vo.setNumero_documento(rs.getString("numero_documento"));
                vo.setTipo_documento(rs.getString("tipo_documento"));
                vo.setLogin(rs.getString("login"));
                vo.setPassword(rs.getString("password"));
                lista.add(vo);
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        System.out.println(lista.size());
        return lista;
    }

    public void registrarNuevoPaciente(Paciente paciente) throws DAOExcepcion {
        String query = "insert into tb_paciente values(null,?,?,?,?,now(),?,?,?,?,?,?);";

        Connection con = null;
        PreparedStatement stmt = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setString(1, paciente.getNombres());
            stmt.setString(2, paciente.getApellidos());
            stmt.setString(3, paciente.getSexo());
            stmt.setString(4, paciente.getFec_nacimiento());
            stmt.setString(5, paciente.getTelefono());
            stmt.setString(6, paciente.getEmail());
            stmt.setString(7, paciente.getNumero_documento());
            stmt.setString(8, paciente.getTipo_documento());
            stmt.setString(9, paciente.getLogin());
            stmt.setString(10, paciente.getPassword());

            int i = stmt.executeUpdate();
            System.out.println(i);
            if (i != 1) {
                throw new SQLException("No se pudo Registrar al Nuevo Paciente!");
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
    }
}

